/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package byblos.negocio.reserva;

import byblos.negocio.pacote.Pacote;
import byblos.negocio.pacote.PacoteAberto;
import byblos.negocio.reserva.prereserva.PreReserva;
import byblos.persistencia.DAO;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author helena linda
 */
public class ReservaUtil {

    public List<Reserva> getReservas(PreReserva preReserva) {
        List<Reserva> reservas = new LinkedList<Reserva>();
        System.out.println("dataCheckin " + preReserva.getCheckin());
        List<AcomodacaoOnline> acomodacoes = new DAO().listar(AcomodacaoOnline.class, "AcomodacaoAtiva");
        for (AcomodacaoOnline acomodacaoOnline : acomodacoes) {
            Reserva reserva = new Reserva(acomodacaoOnline, preReserva);
            verificarDisponibilidade(reserva);

            List<Pacote> pacotesConflitantes = null;
            //if (reserva.temPacote()) {
            pacotesConflitantes = new LinkedList<Pacote>();
            pacotesConflitantes.addAll(new DAO().listar(PacoteAberto.class, "PacoteAbertoPorPeriodo", reserva.getDataCheckin(), reserva.getDataCheckout()));
            pacotesConflitantes.addAll(new DAO().listar(PacoteAberto.class, "PacoteFechadoPorPeriodo", reserva.getDataCheckin(), reserva.getDataCheckout()));
            //}
            reserva.verificarSeEhConsulta(pacotesConflitantes);

            int quantidadeDiasTemporada = getQuantidadeDiasTemporada(reserva);
            reserva.calcularTotal(quantidadeDiasTemporada);
            reservas.add(reserva);
        }
        return reservas;
    }

    public void verificarDisponibilidade(Reserva reserva) {
        boolean livre = !reserva.temIndisponibilidade();
        System.out.println("verificarDisponibilidade()");
        System.out.println("checkin " + reserva.getDataCheckin());
        System.out.println("checkout " + reserva.getDataCheckout());
        if (livre) {
            List<Reserva> reservasConflitantes = new DAO().listar(Reserva.class,
                    "ReservaPorPeriodoAcomodacaoOnline",
                    reserva.getDataCheckin(),
                    reserva.getDataCheckout(),
                    reserva.getAcomodacaoOnline());
            livre = reservasConflitantes.isEmpty();
        }
        reserva.setDisponivel(livre);
    }

    private int getQuantidadeDiasTemporada(Reserva reserva) {
        List<Temporada> temporadas = new DAO().listar(Temporada.class, "TemporadaPorPeriodo", reserva.getDataCheckin(), reserva.getDataCheckout());
        int quantidadeDiasTemporada = 0;
        for (Temporada temporada : temporadas) {
            quantidadeDiasTemporada += temporada.getQuantidadeDiasNaReserva(reserva);
        }
        return quantidadeDiasTemporada;
    }
}